package com.yunyun400.vosk.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class FfmpegUtil {

	@Value("${ffmpeg.path}")
    private String ffmpeg_path;  // FFMPEG路径
	
    /**
     * 使用 FFmpeg 将 MP3 文件转换为 Vosk 所需的 PCM 文件 (16kHz, 16bit, mono)。
     * @param mp3InputFilePath 输入 MP3 文件的绝对路径。
     * @param pcmOutputFilePath 输出 PCM 文件的绝对路径。
     * @throws IOException 如果 FFmpeg 执行失败。
     * @throws InterruptedException 如果进程被中断。
     */
    public void convertMp3ToPcm(String mp3InputFilePath, String pcmOutputFilePath) throws IOException, InterruptedException {
        // 构建 FFmpeg 命令
        // -i: 输入文件
        // -ar: 采样率 (16000 Hz)
        // -ac: 声道数 (1 for mono)
        // -sample_fmt: 采样格式 (s16 for 16-bit signed)
        // -f: 强制输出格式 (s16le for PCM signed 16-bit little-endian)
        // -y: 覆盖已存在的输出文件
        String[] cmd = {
        	ffmpeg_path,
            "-i", mp3InputFilePath,
            "-ar", "16000",
            "-ac", "1",
            "-sample_fmt", "s16",
            "-f", "s16le",
            "-y",
            pcmOutputFilePath
        };

        ProcessBuilder processBuilder = new ProcessBuilder(cmd);
        // 将子进程的输出和错误流重定向，以便在 Java 中捕获
        processBuilder.redirectErrorStream(true);
        Process process = processBuilder.start();

        // 启动一个线程来读取 FFmpeg 的输出，防止进程因输出缓冲区满而阻塞
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
            String line;
            while ((line = reader.readLine()) != null) {
                // 你可以选择在这里打印日志，或忽略
                //System.out.println("FFmpeg: " + line);
            }
        }

        // 等待进程执行完毕，并获取退出码
        int exitCode = process.waitFor();
        if (exitCode != 0) {
            throw new IOException("FFmpeg 转换失败，退出码: " + exitCode);
        }
    }
}